題目
美術館有n 種票,票價為 p1、p2、p3 直到 pn,所需張數為 x1、x2、x3 直到 xn,且身上有 t 元。題目會給定 b, 代表總共可買的張數上限,亦即 x1 和 x2 總和不可超過 b (但可以剛好等於)。如果你想買的票超過張數上限,就印出 −1;如果張數沒問題但錢不夠,就印出 −2;如果張數沒問題而且錢也夠,就印出櫃台會找多少錢。
我們要用「最有效率」的方式找錢,而所謂「最有效率」的方式,即是按照面額由大到小依序找開。舉例來說,現在你有 500、100、50、10、5、1 這些面額的紙鈔或零錢,若所要找的錢為 683 元,則會先找 1 張 500、1 張 100,再找 1 個 50 元、3 個 10 元,最後是 3 個 1 元。若張數未超過上限且錢夠找,則印出上述各面額所需數量,兩兩以一個逗號隔開。以找 683 元為例,請輸出 1, 1, 1, 3, 0, 3。
輸入輸出格式
Sol
基本上這題是一個簡單的for、if-else的應用,除了題目給定的n、t、b、xi、pi以外,我們還需要建立一些變數。
totalQ
:全部要買的票數totalP
:全部要買的票價change
:change = t – totalP,代表需要找多少錢q500
、q100
、q50
、q10
、q5
、q1
:各面額所需找的數量,例如 q100 = 5 即為需要找 5 張 100 元鈔票。
而這題我們可以分為三種情況:
i. 想買的票超過張數上限:印出 −1
ii. 張數沒問題但錢不夠:印出 −2
iii. 張數、錢都夠:印出各面額需找多少數量
Pseudocode
cin >> n、t、b
for (int i = 0; i < n; i++)
int xi, pi; // 大家可以自行設定變數名稱
cin >> xi >> pi;
totalQ += xi;
totalP += xi * pi;
if (totalQ > b)
印出 -1
else if (totalP > t)
印出 -2
else
q500 = change / 500;
change -= q500 * 500;
q100 = change / 100;
change -= q100 * 100;
q50 = change / 50;
change -= q50 * 50;
q10 = change / 10;
change -= q10 * 10;
q5 = change / 5;
q1 = change - q5 * 5;
cout << q500 << ',' << q100 << ',' << q50 << ',' << q10 << ',' << q5 << ',' << q1;
結語
由 if
、else if
、else
的組合,我們就可以分別判斷這三個情況並輸出答案囉!